/*!
 * @file modeBase.hh
 * @brief Klasa bazowa dla trybów + definicje trybów działania
 */

//TODO Przenieść to pod ifndefa
#include "engine/pawirr.hh"

#ifndef _MODES_MODEBASE_HH
#define _MODES_MODEBASE_HH

#include <sstream>

#include "engine/basic/point2f.hh"
#include "engine/basic/point3f.hh"
#include "engine/basic/color.hh"
#include "engine/basic/texture.hh"

#include "engine/basic/font.hh"

/*!
 * @brief tryby działania
 * MA_ALWAYS - zawsze aktywny
 * MA_ONDEMAND - aktywny po uruchomieniu do czasu uruchomienia następnego
 */
enum _mode_active {
	MA_ALWAYS, MA_ON, MA_OFF
};

/*!
 * @brief priorytety dostępu do klawiatury
 * MK_CONSOLE - pierwsze
 * MK_6 - najniższy
 */
enum _mode_keys {
	MK_IMPORTANT, MK_1, MK_2, MK_NORMAL, MK_3, MK_4, MK_NOTIMPORTANT
};

/*!
 * @brief priorytety malowania
 */
enum _mode_draw {
	MD_BACKGROUND, MD_1, MD_2, MD_NORMAL, MD_3, MD_4, MD_FOREGROUND
};

/*!
 * @brief Klasa bazowa dla trybów
 */
class modeBase {
public:
	/*!
	 * @brief Konstruktor
	 * @param ma Sposób aktywności
	 * @param mk Priorytet w dostępie do klawiatury
	 * @param md Priorytet w malowaniu
	 * @param sname Nazwa skrótowa
	 * @return Obiekt
	 */
	modeBase(_mode_active ma, _mode_keys mk, _mode_draw md, std::string sname);

	/*!
	 * @brief Renderowanie trybu 2d
	 */
	virtual void render2d() = 0;

	/*!
	 * @brief Renderowanie trybu 3d
	 */
	virtual void render3d() = 0;

	/*!
	 * @brief Obliczenia
	 */
	virtual void calculate() = 0;

	/*!
	 * @brief Przetwarzanie wejścia
	 */
	virtual void input() = 0;

	/*!
	 * @brief Do wywołania po wykonaniu konstruktora
	 */
	virtual void init() = 0;

	/*!
	 * @brief Pobieranie nazwy trybu
	 * @return Nazwa trybu
	 */
	std::string getName();

	/*!
	 * @brief Priorytet rysowania
	 */
	_mode_draw setDraw;

	/*!
	 * @brief Priorytet dla klawiatury
	 */
	_mode_keys setKeys;

	/*!
	 * @brief Aktywność
	 */
	_mode_active setActive;

private:
	/*!
	 * @brief Nazwa - skrót
	 */
	std::string name;

};

#else
class modeBase;
#endif
